سؤال

ولدي 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));

وربما تكون هناك وسيلة أكثر كفاءة للقيام بذلك، ولكن شيئا من هذا القبيل يجب أن تعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top