تاريخ DataTable ومع قائمة
سؤال
ولدي DataTable ووقائمة الكائنات. ولست بحاجة للعودة كافة الصفوف في DataTable حيث خاصية في قائمة هي قيمة معينة. يتم استخدام قائمة فقط لتصفية DataTable و(ولكن لا containined العمود مرشح في DataTable).
وأنا متأكد من أن هذا يجب أن يكون من الممكن مع LINQ.
ووDataTable ويحتوي على:
MembershipID Username Password
1 blah blah
2 blah blah
3 blah blah
وبلدي قائمة تحتوي على:
MembershipID Profile1 Profile2 Profile3 DifferentID
1 blah blah blah A
2 blah blah blah B
3 blah blah blah C
ولست بحاجة للعودة (كما DataTable و) - على سبيل المثال: لGetUsersByDifferentID ( "B"):
MembershipID Username Password
2 blah blah
...
وأتمكن من الحصول على الجدول الثاني كما DataTable وإذا كان ذلك من شأنه أن يجعل من الأسهل، ولكن أعتقد أن ما احتاج اليه هو ممكن مع LINQ. أنا فقط لا يمكن الحصول على رأسي حول بناء الجملة السحرية.
المحلول
ويمكنك القيام بذلك باستخدام الانضمام:
List<ListItem> listItems = //whatever
DataTable dtItems = //whatever
IEnumerable<DataRow> matchingRows = listItems
.Join( dtItems.AsEnumerable(),
listItem => listItem.MembershipID,
row => row.Field<int>("MembershipID"),
(r,li) => new { DifferentId = li.DifferentId, Row = r })
.Where( ji => ji.DifferentID == "B")
.Select( ji => ji.Row);
وتغيير حيث شرط لاستخدام القيمة الفعلية التي تريد تطابق ...
نصائح أخرى
وماذا عن شيء من هذا القبيل. دعنا نقول قائمة الخاص بك هو عبارة عن مجموعة من هذه الفئة:
public class SomeMemberClass
{
public int MembershipId { get; set; }
public char DifferentId { get; set; }
//..some more properties
}
وبعد ذلك يمكنك أن تفعل شيئا من هذا القبيل:
DataTable table = new DataTable();
table.Columns.Add("MembershipId", typeof(int));
table.Columns.Add("UserName");
table.Columns.Add("Password");
List<SomeMemberClass> list = new List<SomeMemberClass>(); //or get the list from somewhere else...
var differntIds = list.Select( s => s.DifferentId).Distinct();
var result = table.AsEnumerable()
.Where( dt => differntIds
.Contains((int)dt["MembershipId"]))
.CopyToDataTable();
وأساسا، أولا الحصول على جميع DifferentId متميزة ومن ثم استخدام ذلك لننظر من خلال الجدول الخاص بك.
وأنا لست متأكدا من ذلك لأنني لم أستطع فهم الكثير عن DataTable والتي أذكر لكم عن ولكن يمكنك أن تجرب هذا
var usersByDifferentId = yourList.Where(a=> a["DifferentID"] == "B").Select(a=> new {a["UserName"],a["MemberShipID"],a["Password"]});
وأعتقد أنك تريد شيئا مثل:
var memberIds = myList.Where(u => u.DifferentID == "B").Select(a => a.MembershipID);
var credentials = myDataTable.Where(d => memberIds.Contains(d.MembershipID));
وربما تكون هناك وسيلة أكثر كفاءة للقيام بذلك، ولكن شيئا من هذا القبيل يجب أن تعمل.