简体   繁体   中英

Select from list linq

I am trying to get matches from linq query-

 public ActionResult TagFilter(TagModel tag) {
        List<CardModel> cardlist = null;
        var cardtaglist = (from u in db.CardTagTables
                           where u.CardTagName == tag.tagName
                           select u).ToList();
        cardlist = (from u in db.CardTables
                    where u.CardID == cardtaglist.Where(e=>e.FKCardTagID==u.CardID)
                    select new CardModel {
                        cardHashCode = tag.tagName,
                        cardDate = u.CardDate,
                        cardFileName = u.CardFileName,
                        cardFilePath = u.CardFilePath,
                        cardID = u.CardID,
                        cardTitle = u.CardTitle
                    }).ToList();
        if (cardlist.Count == 0) {
            return Json(new { success = false });
        }
        else {
            return PartialView("_FunHomePartial", cardlist);
        }

    }

Where match of tag=>tagName would be from list cardtaglist .

I get Cannot implicitly convert type int to bool error in line-

  where u.CardID == cardtaglist.Where(e=>e.FKCardTagID==u.CardID)

How Do I match elements from list cardtaglist ?

How to about replace

u.CardID == cardtaglist.Where(e=>e.FKCardTagID==u.CardID)

with

cardtaglist.Any(e=>e.FKCardTagID==u.CardID)

First of all, why you select all CardTagTable entity, if you use only FKCardTagID !? The best way - to select only required fields:

var cardtagIds = (from u in db.CardTagTables
                  where u.CardTagName == tag.tagName
                  select u.FKCardTagID).ToList();

About your error, you are traying to compare IQueriable with numeric value. You can use Contains method in this case:

cardlist = (from u in db.CardTables.Where(u => cardtagIds.Contains(u.CardID));
            select new CardModel {
            ....

Edit

Also, this query can be optimized:

cardlist = (from u in db.CardTables.Where(u => 
                db.CardTagTables
                   .Where(ct => ct.CardTagName == tag.tagName)
                   .Select(ct => ct.FKCardTagID)
                   .Contains(u.CardID))
            select new CardModel {
            ....

采用:

   var result=cardtaglist.Any(e=>e.FKCardTagID==u.CardID)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM