【问题标题】:LINQ query with value from dropdown to compare with data使用下拉列表中的值进行 LINQ 查询以与数据进行比较
【发布时间】:2023-03-11 14:16:01
【问题描述】:

我的查询如下。有人可以帮我如何在我的 Linq 语句中添加 dbquery 吗?有一条评论“在此处添加”。我从昨天开始就在挣扎。想法是形成一个LINQ语句并立即获取列表。谢谢。

String dbwhere = "";
if (ddlName.SelectedItem.Value != "")
{
    dbwhere = " && (User.Name == '" + ddlName.SelectedItem.Value.TrimEnd() + "')";
}
if (ddlHeightFrom.SelectedItem.Value != "")
{
    dbwhere = dbwhere + " && (Physical.Height >= '" + ddlHeightFrom.SelectedItem.Value.TrimEnd() + "')";
}
if (ddlHeightTo.SelectedItem.Value != "")
{
    dbwhere = dbwhere + " && (Physical.Height <= '" + ddlHeightTo.SelectedItem.Value.TrimEnd() + ")";
}

var usersquery = (
  from physical in dbContext.Physicals
  join user in dbContext.User on physical.UserID equals user.UserID
  join photos in dbContext.Photo on User.UserID equals photos.UserID
  where photos.PhotoNum == 1 && photos.Status == true
  // =======  Add dbwhere here ============
  select new
  {
     photos.PhotoURL,
     photos.PhotoDescription,
     user.State,
     user.Country,
     physical.EyesColor,
     physical.HairColorInfo,
     physical.HairTypeInfo,
     physical.BodyHeight,
     physical.BodyWeight,
  }).ToList();

【问题讨论】:

    标签: c# sql-server entity-framework linq linq-to-entities


    【解决方案1】:

    您可以重写查询以避免将 linq 与 SQL 混合(并使其免受 SQL 注入)

    var usersquery = (
        from physical in dbContext.Physicals
        join user in dbContext.User on physical.UserID equals user.UserID
        join photos in dbContext.Photo on User.UserID equals photos.UserID
        where photos.PhotoNum == 1 && photos.Status == true
        select new
        {
            physical,
            user,
            photos,
        }; // do not put ToList here!
    

    现在您可以添加特殊检查:

    if (ddlName.SelectedItem.Value != "")
    {
      var userName = ddlName.SelectedItem.Value.TrimEnd();
      usersquery = usersquery.Where(x => x.user.Name == userName);
    }
    
    if (ddlHeightFrom.SelectedItem.Value != "")
    {
      var height = int.Parse(ddlHeightFrom.SelectedItem.Value.TrimEnd());
      usersquery = usersquery.Where(x => x.physical.Height >= height);
    }
    
    // and so on
    

    现在您可以使用 ToList 实现您的数据

    var result = usersquery.Select(x => new 
      {
        x.photos.PhotoURL,
        x.photos.PhotoDescription,
        x.user.State,
        x.user.Country,
        x.physical.EyesColor,
        x.physical.HairColorInfo,
        x.physical.HairTypeInfo,
        x.physical.BodyHeight,
        x.physical.BodyWeight
      }).ToList();
    

    注意:我是用记事本写的,所以可能有错误。但是我希望想法很清楚

    【讨论】:

    • 困难的部分是会有巨大的数据,希望这不会减慢加载时间我会尝试。谢谢。
    • @dotNETEngineer 当您第一次创建 usersquery 时,不会发生实际的数据获取。只有在使用ToList() 方法应用所有过滤器(如果存在)后才会查询数据。所以我的方法只会查询 db 一次。
    • 太棒了,在这里遇到了一些铸造问题,但我正在研究,... var race = ddlRace.SelectedItem.Value.TrimEnd();照片查询 = 照片查询.Where(x => x.Race == 种族); iEnnumerable 到 GeneralList
    • 当我在最后添加 ToList() 时,它可以工作。 var 种族 = ddlRace.SelectedItem.Value.TrimEnd(); photosquery = photosquery.Where(x => x.Race == race).ToList();
    • 正如你所提到的,我不应该将 ToList() 放在结果选择(结束)之前,我正在努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2016-02-17
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多