Linq 从一个表而不是其他表中选择数据

问题描述 投票:0回答:6

嗨,我有以下代码可以从一个表而不是其他表中选择数据

var result1 = (from e in db.Users
               select e).ToList();
var result2 = (from e in db.Fi
               select e).ToList();
List<string> listString = (from e in result1
                           where !(from m in result2
                                   select m.UserID).Contains(e.UserID)
                           select e.UserName).ToList();

ViewBag.ddlUserId = listString;

在 listString 中获取值。但是在将 listString 添加到 viewbag 时出现错误。

Unable to cast object of type 'System.Collections.Generic.List`1[System.String]' to type 'System.Collections.Generic.IEnumerable`1[Main.Models.Admin.User]'.
c# asp.net-mvc-3 linq
6个回答
33
投票

首先,您能否用整个方法更新您的问题,以便我们可以了解

ViewBag
可能发生了什么?因为您的代码应该可以正常工作,所以通常为 ViewBag 分配任何值都没有问题:

    ViewBag.property1 = 0;
    ViewBag.property1 = "zero";

效果很好。

ViewBag
是动态的。现在,如果您稍后尝试将
ViewBag.ddlUserId
分配给实际上是错误类型的内容,则可能会收到该错误。

我也希望你重写你的陈述,让我解释一下原因。假设您的

User
中有很多 (> 100.000)
db.Users
记录,我们也假设
Fi
也是如此。在您的代码中,
result1
result2
现在是两个列表,一个包含 >100.000 个
User
对象,另一个包含 >100.000 个
Fi
对象。然后将这两个列表相互比较以生成字符串列表。现在想象一下您的 Web 服务器处理此问题所需的资源。假设您实际使用/访问单独的 SQL 服务器来检索数据,那么让该服务器完成工作(即生成 UserID 列表)会更好更快。 为此,您可以使用 Kirill Bestemyanov 的答案或以下内容:

    var list = (from user in db.Users
                where !db.Fi.Any(f => f.UserID == user.UserID)
                select user.UserName).ToList()

这将只生成一个查询供 SQL 服务器执行:

    SELECT 
    [Extent1].[UserName] AS [UserName]
    FROM [dbo].[Users] AS [Extent1]
    WHERE  NOT EXISTS (SELECT 
        1 AS [C1]
    FROM [dbo].[Fi] AS [Extent2]
    WHERE [Extent2].[UserID] = [Extent1].[UserID]
    )}

最终是你想要的...

只是为了澄清更多:

    var list = (from user in db.Users
                where !db.Fi.Any(f => f.UserID == user.UserID)
                select user.UserName).ToList()

也可以写成下面的lambda表达式:

    var list = db.Users.Where(user => !db.Fi.Any(f => f.UserID == user.UserID))
               .Select(user => user.UserName).ToList()

从外观上看,它与 Kirill Bestemyanov 的答案略有不同(我稍微修改了一下,只是为了使其看起来更相似):

    var list = db.Users.Where(user => !db.Fi.Select(f => f.UserID)
                                            .Contains(user.UserID))
                              .Select(user => user.UserName).ToList();

但是,它们实际上会产生相同的 SQL 语句,从而产生相同的列表。


9
投票

我将其重写为 linq 扩展方法:

List<string> listString = db.Users.Where(e=>!db.Fi.Select(m=>m.UserID)
                                                  .Contains(e.UserID))
                                  .Select(e=>e.UserName).ToList();

尝试一下,应该有效。


7
投票

试试这个,非常简单。

var result=(from e in db.Users
            select e.UserID).Except(from m in db.Fi
                                    select m.UserID).ToList();

1
投票
var res = db.tbl_Ware.Where(
    a => a.tbl_Buy.Where(
        c =>c.tbl_Ware.Title.Contains(
            mtrTxtWareTitle.Text)).Select(b => b.Ware_ID).Contains(a.ID));

这在 T-SQL 中的意思是:

select * 
from tbl_Ware 
where id in (
    select ware_ID tbl_Buy where tbl_Ware.title like '% mtrTxtwareTitle.Text %')

-1
投票
getdata = (from obj in db.TblManageBranches
   join objcountr in db.TblManageCountries on obj.Country equals objcountr.iCountryId.ToString() into objcount
   from objcountry in objcount.DefaultIfEmpty()
   where obj.IsActive == true
   select new BranchDetails
   {
       iBranchId = obj.iBranchId,
       vBranchName = obj.vBranchName,
       Addressline1 = obj.Addressline1,
       Adminemailid = obj.Adminemailid,
       BranchType = obj.BranchType,
       Country = objcountry.vCountryName,
       CreatedBy = obj.CreatedBy,
       CreatedDate = obj.CreatedDate,
       iArea = obj.iArea,
       iCity = obj.iCity,
       Infoemailid = obj.Infoemailid,
       Landlineno = obj.Landlineno,
       Mobileno = obj.Mobileno,
       iState = obj.iState,
       Pincode = obj.Pincode,
       Processemailid = obj.Processemailid,
       objbranchbankdetails = (from objb in db.TblBranchesBankDetails.Where(x => x.IsActive == true && x.iBranchId == obj.iBranchId)
                               select new ManageBranchBankDetails
                               {
                                   iBranchId = objb.iBranchId,
                                   iAccountName = objb.iAccountName,
                                   iAccountNo = objb.iAccountNo,
                                   iBankName = objb.iBankName,
                                   iAccountType = objb.iAccountType,
                                   IFSCCode = objb.IFSCCode,
                                   SWIFTCode = objb.SWIFTCode,
                                   CreatedDate = objb.CreatedDate,
                                   Id = objb.Id
                               }).FirstOrDefault(),
       objbranchcontactperson = (from objc in db.tblbranchcontactpersons.Where(x => x.Isactive == true && x.branchid == obj.iBranchId)
                                 select new ManageBranchContactPerson
                                 {
                                     branchid = objc.branchid,
                                     createdate = objc.createdate,
                                     Id = objc.Id,
                                     iemailid = objc.iemailid,
                                     ifirstname = objc.ifirstname,
                                     ilandlineno = objc.ilandlineno,
                                     ilastname = objc.ilastname,
                                     imobileno = objc.imobileno,
                                     title = objc.title,
                                     updateddate=objc.updateddate,
                                 }).ToList(),
   }).OrderByDescending(x => x.iBranchId).ToList();

-1
投票
getdata = (from obj in db.TblManageBranches join objcountr in db.TblManageCountries on obj.Country equals objcountr.iCountryId.ToString() into objcount from objcountry in objcount.DefaultIfEmpty() where obj.IsActive == true
    select new BranchDetails
    {
       iBranchId = obj.iBranchId,
       vBranchName = obj.vBranchName,
      
       objbranchbankdetails = (from objb in db.TblBranchesBankDetails.Where(x => x.IsActive == true && x.iBranchId == obj.iBranchId)
                               select new ManageBranchBankDetails
                               {
                                   iBranchId = objb.iBranchId,
                                   iAccountName = objb.iAccountName,
                                   
                               }).FirstOrDefault(),
       objbranchcontactperson = (from objc in db.tblbranchcontactpersons.Where(x => x.Isactive == true && x.branchid == obj.iBranchId)
                                 select new ManageBranchContactPerson
                                 {
                                     branchid = objc.branchid,
                                     createdate = objc.createdate,
                                     Id = objc.Id,
                                     iemailid = objc.iemailid,
                                    
                                 }).ToList(),
    }).OrderByDescending(x => x.iBranchId).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.