12

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

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]'.
4

6 回答 6

31

首先,您能否用整个方法更新您的问题,以便我们可以看到ViewBag? 因为您的代码应该可以正常工作,所以为 ViewBag 分配任何值通常都没有问题:

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

工作得很好。ViewBag是动态的。现在,如果您稍后尝试使用ViewBag.ddlUserId实际上是错误类型的东西,您可能会收到该错误。

我希望你也重写你的陈述,让我解释一下原因。假设您有很多(> 100.000)条User记录,db.Users 我们也假设相同Fi。在您的代码中,result1现在result2是两个列表,一个包含 >100.000 个User对象,另一个包含 >100.000 个Fi对象。然后将这两个列表相互比较以生成字符串列表。现在想象一下您的 Web 服务器处理它所需的资源。假设您实际使用/访问单独的 SQL 服务器以从中检索数据,让该服务器完成工作(即生成用户 ID 列表)会更好更快。为此,您可以使用 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()

从外观上看,它与基里尔·贝斯特米亚诺夫的回答略有不同(我稍作修改,只是为了让它看起来更相似):

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

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

于 2013-04-27T07:28:12.803 回答
8

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

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

试试吧,它应该工作。

于 2013-04-27T05:43:32.970 回答
7

试试这个很简单。

var result=(from e in db.Users
            select e.UserID).Except(from m in db.Fi
                                    select m.UserID).ToList();
于 2013-05-22T08:00:46.577 回答
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 %')
于 2018-12-15T20:10:12.577 回答
-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();
于 2021-10-16T05:54:08.857 回答
-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();
于 2021-10-16T07:20:16.283 回答