使用动态参数从EF中检索多个实体

时间:2018-01-13 15:55:05

标签: c# entity-framework asp.net-web-api

我正在将Web API 2与实体框架结合使用。我想用控制器方法检索多个实体。我从请求标头中提取参数。然后我将它转换为包含名称和值的二维数组。然后我想从db中获取所有匹配的实体。我已经使用SqlQuery()方法结合参数数组尝试了它,但这也不起作用。

我收到错误:

  

System.Data.Entity.Core.EntityCommandExecutionException`
  datareader与给定值不兼容。类型的元素('ADRESSE1')在同名的数据读取器中没有对应的列。

这是我的模特:

public partial class ADRESSE
{
    public int id { get; set; }
    public string ADRESSE1 { get; set; }
    public string PERSONAL { get; set; }
    public string LIEFERADR { get; set; }
    public string RECHNUNGADR { get; set; }
    public string FIRMA { get; set; }
    public string FIRMA1 { get; set; }
    ...
}

这是数据库中的表。 (由于项目客户端我无法更改db中的任何命名)

CREATE TABLE [dbo].[ADRESSE]
(
    [id] [int] NOT NULL,
    [ADRESSE] [nvarchar](15) NOT NULL,
    [PERSONAL] [nvarchar](31) NULL,
    [LIEFERADR] [nvarchar](15) NULL,
    [RECHNUNGADR] [nvarchar](15) NULL,
    [FIRMA] [nvarchar](15) NULL,
    [FIRMA1] [nvarchar](63) NULL,
    ...
)

我的查询:

[HttpGet]
[AcceptVerbs("GET", "HEAD")]
public IQueryable<ADRESSE> GetADRESSE()
{
   var header = HeaderExtractionProvider.GetRequestHeaders(Request.Headers);
   if (header.Count > 0)
   {
      var paramArray = new List<SqlParameter>();
      foreach (var param in header)
      {
         paramArray.Add(new SqlParameter(param[0], param[1]));
      }

      var test = db.ADRESSE.SqlQuery("Select * from ADRESSE", paramArray.ToArray());
      //return all found adresses here.
   }
   return db.ADRESSE;
}

2 个答案:

答案 0 :(得分:1)

您获取的数据库错误是因为您的媒体资源名称ADRESSE1ADRESSE的数据库列不同。它不知道如何映射它。

您可以使用System.ComponentModel.DataAnnotations.Schema中的ColumnAttribute修复Entity Framework的问题。

public partial class ADRESSE
{
    public int id { get; set; }
    [Column("ADRESSE")]
    public string ADRESSE1 { get; set; }
    public string PERSONAL { get; set; }
    public string LIEFERADR { get; set; }
    public string RECHNUNGADR { get; set; }
    public string FIRMA { get; set; }
    public string FIRMA1 { get; set; }
    ...
}

然后您可以创建这样的LINQ查询:

var addresses = db.Addresses.Where(ad => paramArray.Contains(ad.Id));

答案 1 :(得分:0)

使用Linq

进行如下查询
  var addressed = db.Addresses.Where(ad => paramArray.Contains(ad.Id));